/*!
 * \file DataManager.h
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief 数据管理器头文件
 * 
 * \details 本文件定义了WonderTrader数据服务系统的核心数据管理器类DataManager：
 *          - 实现IDataWriterSink接口，提供数据写入和广播功能
 *          - 管理实时行情数据的接收、处理和分发
 *          - 支持tick数据、订单队列、订单明细、逐笔成交数据处理
 *          - 集成数据写入器、状态监控器、UDP广播器
 *          - 支持历史数据转储和会话管理
 *          - 提供数据广播和订阅管理功能
 *          - 支持扩展数据导出器注册
 *          - 提供交易日期和会话状态查询
 */
#pragma once

#include "../Includes/IDataWriter.h"
#include "../Share/StdUtils.hpp"
#include "../Share/BoostMappingFile.hpp"

NS_WTP_BEGIN
class WTSTickData;
class WTSOrdQueData;
class WTSOrdDtlData;
class WTSTransData;
class WTSVariant;
NS_WTP_END

USING_NS_WTP;

class WTSBaseDataMgr;
class StateMonitor;
class UDPCaster;

/**
 * @class DataManager
 * @brief 数据管理器类
 * 
 * @details DataManager是WonderTrader数据服务系统的核心数据管理器，负责：
 *          - 实现数据写入器接口，处理各种行情数据
 *          - 管理实时行情数据的接收、验证和分发
 *          - 支持tick数据、Level2数据（订单队列、订单明细、逐笔成交）处理
 *          - 集成数据写入器进行数据持久化
 *          - 通过UDP广播器进行实时数据分发
 *          - 配合状态监控器进行会话状态管理
 *          - 支持扩展数据导出器的注册和管理
 *          - 提供历史数据转储和查询功能
 *          - 管理交易会话和合约订阅
 * 
 * @note 该类是数据服务系统的核心组件，负责数据流的统一管理
 * @warning 必须正确初始化所有依赖组件才能正常工作
 */
class DataManager : public IDataWriterSink
{
public:
	/**
	 * @brief 构造函数
	 * @details 初始化数据管理器，设置默认参数
	 */
	DataManager();
	
	/**
	 * @brief 析构函数
	 * @details 清理资源，释放所有组件
	 */
	~DataManager();

public:
	/**
	 * @brief 初始化数据管理器
	 * @details 根据配置参数初始化数据管理器及其依赖组件
	 * @param params 配置参数对象
	 * @param bdMgr 基础数据管理器
	 * @param stMonitor 状态监控器
	 * @param caster UDP广播器（可选）
	 * @return bool 初始化是否成功
	 */
	bool init(WTSVariant* params, WTSBaseDataMgr* bdMgr, StateMonitor* stMonitor, UDPCaster* caster = NULL);

	/**
	 * @brief 添加扩展数据导出器
	 * @details 注册一个扩展的历史数据导出器
	 * @param id 导出器标识符
	 * @param dumper 历史数据导出器接口
	 */
	void add_ext_dumper(const char* id, IHisDataDumper* dumper);

	/**
	 * @brief 释放数据管理器
	 * @details 释放所有资源，清理数据管理器状态
	 */
	void release();

	/**
	 * @brief 写入tick数据
	 * @details 处理和写入实时tick行情数据
	 * @param curTick 当前tick数据
	 * @param procFlag 处理标志
	 * @return bool 写入是否成功
	 */
	bool writeTick(WTSTickData* curTick, uint32_t procFlag);

	/**
	 * @brief 写入订单队列数据
	 * @details 处理和写入Level2订单队列数据
	 * @param curOrdQue 当前订单队列数据
	 * @return bool 写入是否成功
	 */
	bool writeOrderQueue(WTSOrdQueData* curOrdQue);

	/**
	 * @brief 写入订单明细数据
	 * @details 处理和写入Level2订单明细数据
	 * @param curOrdDetail 当前订单明细数据
	 * @return bool 写入是否成功
	 */
	bool writeOrderDetail(WTSOrdDtlData* curOrdDetail);

	/**
	 * @brief 写入逐笔成交数据
	 * @details 处理和写入Level2逐笔成交数据
	 * @param curTrans 当前逐笔成交数据
	 * @return bool 写入是否成功
	 */
	bool writeTransaction(WTSTransData* curTrans);

	/**
	 * @brief 转储历史数据
	 * @details 将指定会话的历史数据进行转储处理
	 * @param sid 会话标识符
	 */
	void transHisData(const char* sid);
	
	/**
	 * @brief 检查会话是否已处理
	 * @details 检查指定会话是否已经完成数据处理
	 * @param sid 会话标识符
	 * @return bool 会话是否已处理
	 */
	bool isSessionProceeded(const char* sid);

	/**
	 * @brief 获取当前tick数据
	 * @details 获取指定合约的最新tick数据
	 * @param code 合约代码
	 * @param exchg 交易所代码（默认为空）
	 * @return WTSTickData* 当前tick数据指针
	 */
	WTSTickData* getCurTick(const char* code, const char* exchg = "");

public:
	//////////////////////////////////////////////////////////////////////////
	//IDataWriterSink接口实现
	
	/**
	 * @brief 获取基础数据管理器
	 * @details 获取基础数据管理器接口
	 * @return IBaseDataMgr* 基础数据管理器指针
	 */
	virtual IBaseDataMgr* getBDMgr() override;

	/**
	 * @brief 检查会话是否可接收数据
	 * @details 检查指定会话是否处于可接收数据状态
	 * @param sid 会话标识符
	 * @return bool 会话是否可接收数据
	 */
	virtual bool canSessionReceive(const char* sid) override;

	/**
	 * @brief 广播tick数据
	 * @details 通过UDP广播器广播tick数据
	 * @param curTick 当前tick数据
	 */
	virtual void broadcastTick(WTSTickData* curTick) override;

	/**
	 * @brief 广播订单队列数据
	 * @details 通过UDP广播器广播订单队列数据
	 * @param curOrdQue 当前订单队列数据
	 */
	virtual void broadcastOrdQue(WTSOrdQueData* curOrdQue) override;

	/**
	 * @brief 广播订单明细数据
	 * @details 通过UDP广播器广播订单明细数据
	 * @param curOrdDtl 当前订单明细数据
	 */
	virtual void broadcastOrdDtl(WTSOrdDtlData* curOrdDtl) override;

	/**
	 * @brief 广播逐笔成交数据
	 * @details 通过UDP广播器广播逐笔成交数据
	 * @param curTrans 当前逐笔成交数据
	 */
	virtual void broadcastTrans(WTSTransData* curTrans) override;

	/**
	 * @brief 获取会话合约集合
	 * @details 获取指定会话的合约代码集合
	 * @param sid 会话标识符
	 * @return CodeSet* 合约代码集合指针
	 */
	virtual CodeSet* getSessionComms(const char* sid) override;

	/**
	 * @brief 获取交易日期
	 * @details 获取指定产品的当前交易日期
	 * @param pid 产品标识符
	 * @return uint32_t 交易日期（格式：YYYYMMDD）
	 */
	virtual uint32_t getTradingDate(const char* pid) override;

	/**
	 * @brief 输出日志信息
	 * @details 输出指定级别的日志信息
	 * @param ll 日志级别
	 * @param message 日志消息
	 */
	virtual void outputLog(WTSLogLevel ll, const char* message) override;

private:
	IDataWriter*		_writer;		/*!< 数据写入器接口 */
	FuncDeleteWriter	_remover;		/*!< 数据写入器删除函数 */
	WTSBaseDataMgr*		_bd_mgr;		/*!< 基础数据管理器 */
	StateMonitor*		_state_mon;		/*!< 状态监控器 */
	UDPCaster*			_udp_caster;	/*!< UDP广播器 */
};

